# 第八章结构数据类型
# 集合
# 创建集合set，set()用来创建集合的函数,type()用来查看数据类型
# 1,可以使用大括号来创建
s={1,2,3,4}
# 2,使用set()函数进行创建
ss=set('1234')
print(type(s))
print(type(ss))


# 集合的添加和删除
# 添加元素
s.add(6)
print(s)
# 删除集合的第一个元素
s.pop()
print(s)
# 删除集合中的元素
s.remove(4)
print(s)

# 创建元组
# 创建空元组
tuple1 =()
print(tuple1)
# 创建带有元素的元组，可以有元组类型
tuple2 =(1,"a",3,"hello",2.2)
print(tuple2)
# 创建只有一个元素的元组
tuple3 =(1,)
print(type(tuple3))

# 使用tuple函数将其它数据类型转换为元组类型
# 语法格式:tuple(数据)
# 将字符串转换成元组
tuple1=tuple('hello,world')
print(tuple1)
# 将列表转换为元组
list1=['python','java','C++','C']
tuple2=tuple(list1)
print(tuple2)

# 从开始索引开始截取，截止到结束索引之前。
tuple1=('h','e','l','l''o')
# 使用正数索引，从0开始
print(tuple1[2])
# 使用负数索引，倒序从-1开始
print(tuple1[-1])

# 使用切片访问元组中的一组数据,前闭后开
# 使用正数切片
print(tuple1[1:4])
# 指定步长
print(tuple1[1:4:2])
# 使用负数切片
print(tuple1[-5:-1])

# # # 修改元组元素
tuple1=(12,34,56)
tuple2=('abc','mn')
# 修改元组元素操作是非法的
# tuple1[0]=100
# 连接元组创建一个新的元组，两个数据必须都是元组
tuple3=tuple1+tuple2
print(tuple3)
# 删除元组
del (tuple1)
#
# # 任务一
n=input('请输入联系人姓名')
t=input('请输入13位手机号')
e=input('输入邮箱地址')
a=input('输入联系地址')
tuple1=("姓名:",n,"联系电话:",t,"邮箱:",e,"地址:",a)
print(tuple1)


# # 列表
# # 列表的创建
# # 使用[]直接创建
list1=[1,"hello",2,"C语言"]
print(list1)
print(type(list1))
# # 创建一个空的
list2=[]
print(list2)
#
# # 使用list()函数将其他类型数据(字符串，元组，range函数)转换为列表:
# # 将字符串转换为列表
list1=list("hello")
print(list1)
# # 创建空列表
print(list())
# # 1.转换字符串
l3=list("hello")
print(l3)
# # 2.转换为元组
t1=tuple("heloo")
l4=list(t1)
print(l4)
# # 3.转换range函数
r1=range(5)
print(r1)
l5=list(r1)
print(l5)

#
# # 访问列表中的元素
l1=[1,2,3,'8','p','u']
# # 使用负向索引进行访问，访问p
print(l1[4])
# # 使用负向索引进行访问p
print(l1[-2])

# # 使用切片访问元素的格式：代码如下：
list1 =['p','y','t','h','o','n']
# # 使用正数切片，截取索引为2,3,4的元素，默认步长为1
print(list1[2:5])
print(list1[:3]) # 截取索引为0-2的元素，起始索引默认为0
# # 截取索引为3-5的元素，结束索引默认为最后一个元素
print(list1[3:])
# # 使用正数切片，截取索引为1-5的元素，步长为2
print(list1[1:6:2])
print(list1)# 负数切片
# # 步长如果是负数，从右向左提取元素
print(list1[::-1])
# # 使用切片的形式访问列表中的元素
l2=['p','u','w','r',1,5,7]
# # 正向取值
# # 使用正切片取出2,3,4的元素
print(l2[2:5])
# # 正切片前三个元素
print(l2[2:5])
# # 正切片后三个元素
print(l2[4:])
# # 使用正切片，取索引1-5的元素，步长为2
print(l2[1:6:2])
# # 负向取值
# # 使用负切片形式取出u,w,r
print(l2[-6:-3])
# # 步长为负数的话，取值从右到左，常用在排序上边，倒序形式
print(l2[::-1])
l3=[10,8,6,5,2,1]
print(l3[::-1])

# # 使用切片的形式访问列表中的元素
l2=['1','2','3','4','5','6']
# # 使用正数切片，截取索引为2,3,4的元素，默认步长为1
print(l2[2:5])
# # 取索引3-5的元素，末尾
#
# # 遍历列表
list1=['pyhton','java','c']
# # 使用for循环遍历列表
for item in list1:
    print(item)
l3=['python','java','c','c++','r','go','javascript']
for i in l3:
    print(i)
#
# # 修改列表元素
# # 修改单个元素
l2=[10,56,34,4,56,44,7]
l4[2]=100
print(l2)
# # 修改多个元素
l5 = [10, 56, 34, 2, 56, 44, 7]
# # 修改1-4个元素的值（不包括第四）
l5[1:4]=[45,-56,98]
print(l5)
#
# # 列表中添加元素
# # 1，append()用与在列表的末尾追加元素
l6=['a','b','c']
l6.append('f')
print(l6)
# # 列表添加列表
l6.append(['e','f'])
print(l6)
#
# # 2.extend()在列表的末尾一次添加多个元素
l7=['a','b','c']
l7.extend('d')
print(l7)
# # 列表添加列表
l7.extend(['e','f','g','h'])
print(l7)
l7.extend('world')
print(l7)
# #3.insert()在列表的特定位置添加
l8 = ['p','c','j']
# # 插入元素，在索引为1插如c++
l8.insert(2,'c++')
print(l6)
# # 11月26日
# # 删除元素
l9=['a','b','c','d']
l9.remove('a')
print(l9)
# # 如果元素不在列表中，删除元素时会报错
# l9.remove('f')
# # pop()方法用来删除列表中指定索引处的元素
l10=[10,56,34,2,56,44,7]
# # 删除索引为3的元素
l10.pop(3)
print(l10)
# # 删除最后一个元素
l10.pop()
print(l10)
# # del可以用来删除列表中单个元素或者一段连续的元素
l11=['a','b','c','d','e']
# # 删除索引为1的元素
del l11[1]
print(l11)
l12=[10,56,34,2,58,44,7]
# # 删除索引为1-3的元素
del l12[1:4]
print(l12)
#
# # 若将列表中的所有元素全部删除，可使用列表clear()方法
l13=['a','b','c','a']
# # 清空列表
l13.clear()
print(l13)

# 任务
# 创建两个空列表name_list和phone_list,用于储存联系人姓名和电话；
# 向列表中添加联系人信息
# 输入联系人编号修改信息
# 输入联系人编号删除信息
# 使用clear()清空通讯录
# name_list=[]
# phone_list=[]
# while 1:
#       print("菜单：1.添加联系人2.修改联系人3.删除联系人")
#       chioce = input("请输入选择:")
#       # 1.添加联系人，包括姓名，手机号
#       if chioce =="1":
#           name_list.append(input("请输入联系人姓名"))
#           phone_list.append(input("请输入联系人手机号"))
#           print(name_list)
#           print(phone_list)
#       # 2.修改联系人信息
#       elif chioce =="2":
#           num = int(input("请输入联系人编号"))
#           if len(name_list) > 0 and num <= len(name_list):
#               name_list[num - 1] = input("请输入联系人姓名")
#               phone_list[num - 1] = input("修改联系电话")
#           else:
#               print("联系人编号输入有误")
#               # 3.删除联系人信息
#       elif chioce == "3":
#         num = int(input("请输入联系人编号"))
#         if len(name_list) > 0 and num <= len(name_list):
#             name_list.pop(num-1)
#             phone_list.pop(num - 1)
#         else:
#             print("联系人编号有误")
#       else:
#           print("显示联系人")
#           print(name_list)
#           print(phone_list)


# 查找元素 index（）列表名，index【要查找的元素，索引起始位置，索引结束位置】
ls1 = [2,3,5,7,8,'a',0,'b','a','b',3]
print(ls1.index(3))
print(ls1.index('b',6,9))
print(ls1.index('a',7))
print(ls1.index(2))
#
# # count()方法来统计某个元素在列表中出现的次数 列表名.count(统计的value元素)
ls2 = [2,3,5,7,8,'a',0,'b','a','b',3,'b',2,5,5,7,1]
print(ls2.count(5))
print(ls2.count(0))
print(ls2.count('b'))

# 元素排序 sort()函数用于对原列表进行排序，如果制定参数，测使用制定的比较函数
# 语法格式为:ls.sort(key=none,reverse=false)
# 1,元素是字符串的排序
ls3=['1','3','44','23','99','88','56','233']
# # 默认升序
ls3.sort()
print(ls3)
# 降序 reverse=ture
ls3.sort(reverse=True)
print(ls3)

# 数字的排序
ls4 = [1,6,5,7,8,9]
ls4.sort()
print(ls4)
# # 降序 reverse=ture
ls4.sort(reverse=True)
print(ls4)
#
# "字典"
# # 字典的创建
# # 1，使用{}创建字典语法格式
# 字典名={'key1':'value1','key2':'velue2','keyn','valuen'}
# # 使用字符串作为key
d1={'python':90,"可视化":89,"英语":85}
print(type(d1))
# # 使用元组和数字作为key
d2={(23,89):"great",30:[1,3,4]}
print(type(d2))
# # 创建空元组
d3={}
print(d3)

# 2,用dict()方法通过关键字的参数来创建字典格式:
# 字典名=dict(key1=value1,key2=value2,key3=value3)

# 字典元素的访问
# 1、字典名[key]
d5={'数学':95,'英语':92,'语文':84}
# 键存在，返回的值value
print(d5['英语'])
# 键不存在，会引发一个keyerror错误
print(d5['语文'])
# 2、get()方法来获取指定键对应的值，语法格式，字典名.get(key[,default])
d6={'数学':95,'英语':92,'语文':84}
# 键存在
print(d6.get('语文'))
# 键存在，不写default，会返回none
print(d6.get('python'))
print(d6.get('python','该键不存在'))

# 字典添加键值对
d7={'数学':95,'英语':92,'语文':84,'python':99}
d7['可视化']=99
print(d7)

# 字典修改键值对
d8={'数学':95,'英语':92,'语文':84,'python':99}
d8['英语']=88
print(d8)

# 字典删除键值对
d9 = {'数学':95,'英语':92,'语文':84,'python':99}
# 1、使用del关键字
del d9['语文']
print(d9)
# 2、使用pop()方法
d9.pop('英语')
print(d9)